/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package modelo;

import clases.Almacen;
import clases.Movimiento;
import clases.TipoMovimiento;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;

/**
 *
 * @author Edder
 */
public class MdlMovimiento implements Modelo<Movimiento>{    
    
    /**
     *
     * @param movimiento
     * @param cnx
     * @throws SQLException
     */
    @Override
    public void insert(Movimiento movimiento, Conexion cnx) throws SQLException{
        String sql = "INSERT INTO movimiento (idTipoMovimiento, fecha, idAlmacenOrigen, idAlmacenDestino) "
                + "VALUES("+ movimiento.getTipoMovimiento().getIdTipoMovimiento() + ","
                + "'" + movimiento.getFecha().toString() + "', "
                + movimiento.getAlmacenOrigen().getIdAlmacen() + ", "
                + movimiento.getAlmacenDestino().getIdAlmacen() + ");";
        cnx.ejecutar(sql);
    }
    
    /**
     *
     * @param cnx
     * @return
     * @throws SQLException
     */
    @Override
    public int getLastId(Conexion cnx) throws SQLException{
        String sql = "SELECT MAX(idMovimiento) FROM movimiento";
        ResultSet rs = cnx.consultar(sql);
        if(rs.next()){
            return rs.getInt(1);
        }
        return -1;
    }
    
    /**
     *
     * @param movimiento
     * @param cnx
     * @throws SQLException
     */
    @Override
    public void update(Movimiento movimiento, Conexion cnx) throws SQLException{
        String sql = "UPDATE movimiento SET "
                + "idTipoMovimiento = " + movimiento.getTipoMovimiento().getIdTipoMovimiento() + ", "
                + "fecha = '" + movimiento.getFecha().toString() + "', "
                + "idAlmacenOrigen = " + movimiento.getAlmacenOrigen().getIdAlmacen() + ", "
                + "idAlmacenDestino = " + movimiento.getAlmacenDestino().getIdAlmacen() + " "
                + "WHERE idMovimiento = " + movimiento.getIdMovimiento();
        cnx.ejecutar(sql);
    }
        
    /**
     *
     * @param idMovimiento
     * @param cnx
     * @return
     * @throws SQLException
     */
    @Override
    public Movimiento get(int idMovimiento, Conexion cnx) throws SQLException{
        String sql = "SELECT * FROM movimiento WHERE idMovimiento = " + idMovimiento;
        ResultSet rs = cnx.consultar(sql);        
        if(rs.next())
            return new Movimiento(idMovimiento,
                    new TipoMovimiento(rs.getInt("idTipoMovimiento"), ' ',null),
                    LocalDate.parse(rs.getString("fecha")),
                    new Almacen(){{this.setIdAlmacen(rs.getInt("idAlmacenOrigen"));}},
                    new Almacen(){{this.setIdAlmacen(rs.getInt("idAlmacenDestino"));}});
        return null;
    }
    
    public ArrayList<Movimiento> getMovimientos(int idAlmacen, Conexion cnx) throws SQLException{
        String sql = "SELECT * FROM movimiento "
                + "WHERE idAlmacenOrigen = " + idAlmacen + " "
                + "OR idAlmacenDestino = " + idAlmacen + ";";
        return get(sql, cnx);
    }
    
    public ArrayList<Movimiento> getMovimientos(int idAlmacen, String fechaInicio, String fechaFin, Conexion cnx) throws SQLException{
        String sql = "SELECT * FROM movimiento "
                + "WHERE (idAlmacenOrigen = " + idAlmacen + " "
                + "OR idAlmacenDestino = " + idAlmacen + ") AND "
                + "fecha >= '" + fechaInicio + "' AND fecha <= '" + fechaFin + "';";
        return get(sql, cnx);
    }

    /**
     *
     * @param sql
     * @param cnx
     * @return
     * @throws SQLException
     */
    @Override
    public ArrayList<Movimiento> get(String sql, Conexion cnx) throws SQLException {
        ArrayList<Movimiento> movimientos = new ArrayList<>();
        ResultSet rs = cnx.consultar(sql);
        while(rs.next()){
            movimientos.add(new Movimiento(
                    rs.getInt("idMovimiento"),
                    new TipoMovimiento(){
                        {
                            this.setIdTipoMovimiento(rs.getInt("idTipoMovimiento"));
                        }
                    },
                    LocalDate.parse(rs.getString("fecha")),
                    new Almacen(){
                        {
                            this.setIdAlmacen(rs.getInt("idAlmacenOrigen"));
                        }
                    },
                    new Almacen(){
                        {
                            this.setIdAlmacen(rs.getInt("idAlmacenOrigen"));
                        }
                    }));
        }
        return movimientos;
    }
}
